#!/bin/bash

# mergeImg.sh boot.img system.img vendor.img userdata.img
# 这个脚本可是输入2-4个参数
start=2048
# 设置分区大小，最好可以设计成有个传入img，那就合并几个img。du --apparent-size 得到的单位是kb，要先转化成扇区块

p1=`du --apparent-size --block-size=1 $1 | awk '{print $1}'`    # 注意符号是反引号， (数字键1左边的键，tab键上面，英文方式输入) 
p2=`du --apparent-size --block-size=1 $2 | awk '{print $1}'`
p3=`du --apparent-size --block-size=1 $3 | awk '{print $1}'`
p4=`du --apparent-size --block-size=1 $4 | awk '{print $1}'`
echo $p1
echo $p2
echo $p3
echo $p4

# 1.先计算合并之后img的大小，并生成空的合并img
mergeImg=$5
imgSize=$(expr \( $start \* 512 + \( $p1 + $p2 + $p3 + $p4 \) \) \/ 1024) 
rm -f ${mergeImg}.temp
echo "合并后img的总大小："$imgSize "KB"
dd if=/dev/zero of=${mergeImg}.temp bs=1K count=$imgSize #> /dev/null 2>&1


# 将 bytes 转化成 sectors
part1=$start
part1_size=$(expr $p1 \/ 512 - 1)
part2=$(expr $start + $part1_size + 1)
part2_size=$(expr $p2 \/ 512 - 1)
part3=$(expr $part2 + $part2_size + 1)
part3_size=$(expr $p3 \/ 512 - 1)
part4=$(expr $part3 + $part3_size + 1)
part4_size=$(expr $p4 \/ 512 - 1)
echo $part1
echo $part2
echo $part3
echo "part4:" $part4
echo "part4_size:" $part4_size
echo $imgSize


# 创建msdos分区表
echo ""
echo "Creating new partition table"
echo -e "o\nw" | fdisk ${mergeImg}.temp #> /dev/null 2>&1
# $?表示上一条命令返回值，-ne表示不等于，$0表示第一个参数。
if [ $? -ne 0 ]; then
	echo "ERROR"
	exit 0
fi
# sync 指令会将存于 buffer 中的资料强制写入硬盘中
sync
echo "New filesystem created on $sdcard"
sleep 1
partprobe -s ${mergeImg}.temp #> /dev/null 2>&1
if [ $? -ne 0 ]; then
	echo "ERROR"
	exit 1
fi
sleep 1

# 给fdisk发送分区命令
echo "n
p
1
$part1
+${part1_size}
a
n
p
2
$part2
+${part2_size}
n
p
3
$part3
+${part3_size}
n
p
$part4
+${part4_size}
t
1
b
t
2
83
t
3
83
t
4
83
w
" | fdisk ${mergeImg}.temp #> /dev/null 2>&1

# 4.只保留合并img分区的头部分区等信息
# 硬盘中的一个扇区是512字节。
# 第一个分区最为重要其中包含引导文件和分区表。
# 1.446字节的引导文件
# 2.64字节的分区表
# 3.2字节的结束符

# 其中一个分区记录信息占分区表16字节，所以分区表只能放4个分区记录信息。因此只能有4个主分区。
# 而扩展分区是将其中一个分区记录信息用来指向其他分区记录的文件。
# 备份镜像的分区信息。重新生成的镜像，只有40960块之前的分区信息，后面的内容是没有的。
rm -f ${mergeImg}
dd if=${mergeImg}.temp of=${mergeImg} bs=1M count=1 #> /dev/null 2>&1
rm -f ${mergeImg}.temp
# 5.追加各分区img
if [ -f $1 ]; then
	dd if=$1 of=${mergeImg} bs=1M conv=notrunc oflag=append #> /dev/null 2>&1
fi
 
if [ -f $2 ]; then
	dd if=$2 of=${mergeImg} bs=1M conv=notrunc oflag=append #> /dev/null 2>&1
fi

if [ -f $3 ]; then
	dd if=$3 of=${mergeImg} bs=1M conv=notrunc oflag=append #> /dev/null 2>&1
fi

if [ -f $4 ]; then
	dd if=$4 of=${mergeImg} bs=1M conv=notrunc oflag=append #> /dev/null 2>&1
fi